package arithmetic1.sort;

import java.text.SimpleDateFormat;
import java.util.Date;

/*
    堆排序
 */
public class HeapSort2 {
    public static void main(String[] args) {
//        int arr[]={4,6,8,5,9,10,4,1,2,4};
        //创建一个非常大的随机数组
        int arr[]=new int[8000000];
        for (int i = 0; i < arr.length; i++) {
            arr[i]=(int)(Math.random()*1000000);
        }

        Date date=new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String time1=sdf.format(date);
        System.out.println("排序前时间为:"+time1);

        //堆排序
        heapSort(arr);

        date=new Date();
        String time2=sdf.format(date);
        System.out.println("排序后时间为:"+time2);

//        System.out.println(Arrays.toString(arr));
    }

    //堆排序
    public static void heapSort(int arr[]){
        //将数组转换为一个大顶堆,从最后一个非叶子节点开始到第一个非叶子节点
        for(int i=arr.length/2-1;i>=0;i--){
            adjust(arr,i,arr.length);
        }
        //将最大的元素放到数组的最后,经过数组长度-1次循环
        int temp;
        for (int i=arr.length-1;i>=0;i--){
            temp=arr[i];
            arr[i]=arr[0];
            arr[0]=temp;
            //将剩余的数继续调整为大顶堆
            adjust(arr,0,i);
        }
    }

    //将以i为索引的节点为根节点的子树转换成大顶堆
    public static void adjust(int arr[],int i,int length){
        int temp=arr[i];
        for (int k=i*2+1;k<=length-1;k=k*2+1){
            if(k+1<=length-1 && arr[k]<arr[k+1]){    //左子节点小于右子节点
                k++;    //将k指向较大的子节点
            }
            if(arr[i]<arr[k]){  //当前节点小于子节点
                arr[i]=arr[k];  //将较大的值赋给当前节点
                i=k;
            }else {
                break;
            }
            //将当前节点的值赋给较大的节点
            arr[k]=temp;
        }
    }
}
